package com.sh.代理模式.动态代理;

import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;


/**
 * 目标类 : 原本想调用的类
 * 代理类 : 代理目标类的类
 * 代理类实现了 InvocationHandler 接口， 类中有 目标类 的引用
 * 代理类中重写了 invoke 方法， invoke 方法中调用了 目标类 的方法, 在调用代码的前后加上要增强的代码
 * 调用时通过 Proxy.newProxyInstance 生成代理对象， 传入的参数是 类加载器， 接口， 调用处理器对象（代理类）
 * 生成的就是代理类对象
 */

public class DynamicProxyExample {
    public static void main(String[] args) {
        MusicPlayer realMusicPlayer = new RealMusicPlayer();
        Object proxyMusicPlayer = Proxy.newProxyInstance(
                RealMusicPlayer.class.getClassLoader(),   // 代理对象的类加载器
                new Class[]{MusicPlayer.class},   // 代理对象的接口
                new MusicPlayerInvocationHandler(realMusicPlayer)  // 代理对象的调用处理器
        );
        MusicPlayer musicPlayer = (MusicPlayer) proxyMusicPlayer;
        musicPlayer.play();

//        Stream
        List<String> list = Arrays.asList(1,2,3,4,5)
                .stream()
                .filter(i -> i > 2)
                .map(i -> i + "")
                .collect(ArrayList::new, List::add, List::addAll);
    }
}